#include "mcconfig.h"

mCConfig::mCConfig()
:m_pJsonMap(nullptr)
,m_pFile(nullptr)
{
    m_pJsonMap = new QMap<QString,QJsonValue>();
}

mCConfig::~mCConfig()
{
    if(m_pFile != nullptr && m_pFile->isOpen())
    {
        m_pFile->close();
        delete m_pFile;
    }
}

mCConfig::mCConfig(const char *filename)
{
    m_pJsonMap = new QMap<QString,QJsonValue>();
    if(filename != NULL && filename != "")
    {
        m_FileName = filename;
        m_pFile = new QFile(m_FileName);
    }
}

mCConfig::mCConfig(QString filename)
{
    mCConfig(filename.toStdString().c_str());
}

bool mCConfig::open(QFile::OpenModeFlag mode,QJsonDocument& jsonDoc)
{
    bool ret = false;

    if(m_pFile == nullptr)
    {
        return ret;
    }

    if(!m_pFile->open(mode))
    {
        qDebug()<<m_FileName<<" config file read error";
    }
    else
    {
        ret = true;
    }

    QJsonParseError* error = new QJsonParseError();
    jsonDoc = QJsonDocument::fromJson(m_pFile->readAll(),error);
    //判断文件是否完整
    if(error->error != QJsonParseError::NoError) //不是正确的
    {
        qDebug()<<m_FileName<<" config parse error is "<<error->errorString();
        ret =false;
    }

    return ret;
}

void mCConfig::close()
{
    if(m_pFile != nullptr)
    {
        m_pFile->close();
    }
}

bool mCConfig::read()
{
    QJsonDocument jsonDoc;
    bool ret = false;
    if(open(QFile::ReadOnly,jsonDoc))
    {
        QJsonObject jsonObj = jsonDoc.object();
        QStringList key_list = jsonObj.keys();
        foreach(QString key,key_list)
        {
            appendValue(key,jsonObj.value(key));
        }

        ret = true;

        close();
    }
    return ret;
}

//write函数目前只支持在本项目中对单个json对象写入  不适用于多个json 对象
bool mCConfig::write(const QString& key,const QJsonValue& jsonvalue)
{
    QJsonDocument jsonDoc;
    bool ret = false;
    if( open(QFile::ReadWrite,jsonDoc))
    {
        QJsonObject jsonObj = jsonDoc.object();
        //清空文件中的之前的内容
        m_pFile->resize(0);

        jsonObj[key] = jsonvalue;

        jsonDoc.setObject(jsonObj);
        m_pFile->write(jsonDoc.toJson());

        ret = true;
        close();
    }
    return ret;
}

//插入数据
void mCConfig::appendValue(QString& key,const QJsonValue& jsonvalue)
{
    (*m_pJsonMap).insert(key,jsonvalue);
}

//获取数据
QJsonValue mCConfig::getJsonValueOfKey(const QString& key)
{
    return (*m_pJsonMap)[key];
}



